/*
 * PacketHeader.h
 * 
 * 网络包头定义
 * 格式：[PacketHeader][Protobuf Data]
 */

#pragma once

#include <cstdint>
#include <cstring>

namespace protocol {

// 消息ID定义
enum MessageId : uint16_t {
    // Echo 消息 (1-10)
    MSG_ECHO_REQUEST = 1,
    MSG_ECHO_RESPONSE = 2,
    
    // Chat 消息 (11-20)
    MSG_LOGIN = 11,
    MSG_LOGIN_RESPONSE = 12,
    MSG_CHAT = 13,
    MSG_PRIVATE = 14,
    MSG_USER_LIST = 15,
    MSG_USER_LIST_RESPONSE = 16,
    MSG_USER_JOINED = 17,
    MSG_USER_LEFT = 18,
};

// 包头结构（16字节，对齐）
#pragma pack(push, 1)
struct PacketHeader {
    uint32_t length;      // 整包长度（含包头），网络字节序
    uint16_t msgId;       // 消息ID
    uint16_t flags;       // 标志位（保留）
    uint32_t reserved1;   // 保留字段1
    uint32_t reserved2;   // 保留字段2
    
    // 常量定义
    static const size_t kHeaderSize = 16;
    static const uint32_t kMaxPacketSize = 64 * 1024 * 1024;  // 64MB
    static const uint32_t kMinPacketSize = kHeaderSize;
    
    // 构造函数
    PacketHeader()
        : length(0), msgId(0), flags(0), reserved1(0), reserved2(0) {
    }
    
    // 设置包长度
    void setLength(uint32_t len) {
        length = len;
    }
    
    // 获取包长度
    uint32_t getLength() const {
        return length;
    }
    
    // 设置消息ID
    void setMsgId(uint16_t id) {
        msgId = id;
    }
    
    // 获取消息ID
    uint16_t getMsgId() const {
        return msgId;
    }
    
    // 验证包头
    bool validate() const {
        if (length < kMinPacketSize || length > kMaxPacketSize) {
            return false;
        }
        return true;
    }
};
#pragma pack(pop)

// 静态断言：确保包头大小正确
static_assert(sizeof(PacketHeader) == PacketHeader::kHeaderSize, 
              "PacketHeader size must be 16 bytes");

} // namespace protocol

